From 0ff15a300209b9976629bdb8ceaae07dce1ec849 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Fri, 9 Nov 2007 12:59:58 +0000 Subject: [PATCH] vmx: Enable WBINVD intercepts to avoid real WBINVD for non-vtd guests. Signed-off-by: Keir Fraser --- xen/arch/x86/hvm/vmx/vmcs.c | 3 ++- xen/arch/x86/hvm/vmx/vmx.c | 12 +++++++++++- xen/include/asm-x86/hvm/vmx/vmcs.h | 1 + xen/include/asm-x86/hvm/vmx/vmx.h | 5 +---- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c index 851814dbf5..7c0d692b8c 100644 --- a/xen/arch/x86/hvm/vmx/vmcs.c +++ b/xen/arch/x86/hvm/vmx/vmcs.c @@ -106,7 +106,8 @@ static void vmx_init_vmcs_config(void) if ( _vmx_cpu_based_exec_control & CPU_BASED_ACTIVATE_SECONDARY_CONTROLS ) { min = 0; - opt = SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES; + opt = (SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | + SECONDARY_EXEC_WBINVD_EXITING); _vmx_secondary_exec_control = adjust_vmx_controls( min, opt, MSR_IA32_VMX_PROCBASED_CTLS2); } diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index e4858d1755..b44cab7885 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -2909,11 +2909,21 @@ asmlinkage void vmx_vmexit_handler(struct cpu_user_regs *regs) } case EXIT_REASON_INVD: + case EXIT_REASON_WBINVD: { - inst_len = __get_instruction_length(); /* Safe: INVD */ + inst_len = __get_instruction_length(); /* Safe: INVD, WBINVD */ __update_guest_eip(inst_len); if ( !list_empty(&(domain_hvm_iommu(v->domain)->pdev_list)) ) + { wbinvd(); + /* Disable further WBINVD intercepts. */ + if ( (exit_reason == EXIT_REASON_WBINVD) && + (vmx_cpu_based_exec_control & + CPU_BASED_ACTIVATE_SECONDARY_CONTROLS) ) + __vmwrite(SECONDARY_VM_EXEC_CONTROL, + vmx_secondary_exec_control & + ~SECONDARY_EXEC_WBINVD_EXITING); + } break; } diff --git a/xen/include/asm-x86/hvm/vmx/vmcs.h b/xen/include/asm-x86/hvm/vmx/vmcs.h index 86ad4edfef..132aa1d529 100644 --- a/xen/include/asm-x86/hvm/vmx/vmcs.h +++ b/xen/include/asm-x86/hvm/vmx/vmcs.h @@ -131,6 +131,7 @@ extern u32 vmx_vmexit_control; extern u32 vmx_vmentry_control; #define SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES 0x00000001 +#define SECONDARY_EXEC_WBINVD_EXITING 0x00000040 extern u32 vmx_secondary_exec_control; extern bool_t cpu_has_vmx_ins_outs_instr_info; diff --git a/xen/include/asm-x86/hvm/vmx/vmx.h b/xen/include/asm-x86/hvm/vmx/vmx.h index 28edcfe088..be0a3fa620 100644 --- a/xen/include/asm-x86/hvm/vmx/vmx.h +++ b/xen/include/asm-x86/hvm/vmx/vmx.h @@ -71,18 +71,15 @@ void vmx_vlapic_msr_changed(struct vcpu *v); #define EXIT_REASON_IO_INSTRUCTION 30 #define EXIT_REASON_MSR_READ 31 #define EXIT_REASON_MSR_WRITE 32 - #define EXIT_REASON_INVALID_GUEST_STATE 33 #define EXIT_REASON_MSR_LOADING 34 - #define EXIT_REASON_MWAIT_INSTRUCTION 36 #define EXIT_REASON_MONITOR_INSTRUCTION 39 #define EXIT_REASON_PAUSE_INSTRUCTION 40 - #define EXIT_REASON_MACHINE_CHECK 41 - #define EXIT_REASON_TPR_BELOW_THRESHOLD 43 #define EXIT_REASON_APIC_ACCESS 44 +#define EXIT_REASON_WBINVD 54 /* * Interruption-information format -- 2.30.2